import os

from shop.model import pool
from shop.util.time_operation import TimeClass


class MyLogger:
    '''
    基本的日志写入类
    '''

    def __init__(self, info="info", warning="warning", debug="debug", error="error"):
        day_str = TimeClass.get_current_date_str()
        home_path = os.getenv('HOME')
        logs_path = os.path.join(home_path, 'logs')
        self.logger_path = os.path.join(logs_path, day_str)
        self.mkdir_logger_dir()
        self.info_name = info
        self.warning_name = warning
        self.debug_name = debug
        self.error_name = error

    def mkdir_logger_dir(self):
        '''
        判断文件夹是否存在，如果不存在，则创建
        :return:
        '''
        if not os.path.exists(self.logger_path):
            os.makedirs(self.logger_path)

    def info(self, msg):
        '''
        保存info信息
        :param msg:
        :return:
        '''
        info_file_path = os.path.join(self.logger_path, self.info_name)
        with open(info_file_path, "a+") as f:
            current_time_str = TimeClass.get_current_datetime_str()
            f.writelines("[{}] : {}\n".format(current_time_str, msg))

    def debug(self, msg):
        '''
        保存debug信息
        :param msg:
        :return:
        '''
        info_file_path = os.path.join(self.logger_path, self.debug_name)
        with open(info_file_path, "a+") as f:
            current_time_str = TimeClass.get_current_datetime_str()
            f.writelines("[{}] : {}\n".format(current_time_str, msg))

    def warnning(self, msg):
        '''
        保存warnning信息
        :param msg:
        :return:
        '''
        info_file_path = os.path.join(self.logger_path, self.warning_name)
        with open(info_file_path, "a+") as f:
            current_time_str = TimeClass.get_current_datetime_str()
            f.writelines("[{}] : {}\n".format(current_time_str, msg))

    def error(self, msg):
        '''
        保存error信息
        :param msg:
        :return:
        '''
        info_file_path = os.path.join(self.logger_path, self.error_name)
        with open(info_file_path, "a+") as f:
            current_time_str = TimeClass.get_current_datetime_str()
            f.writelines("[{}] : {}\n".format(current_time_str, msg))


class KLogger:
    '''
    进一步封装的日志写入类，增加静态方法，可以直接调用
    '''

    @staticmethod
    def info(msg):
        m = MyLogger()
        m.info(msg)

    @staticmethod
    def debug(msg):
        m = MyLogger()
        m.debug(msg)

    @staticmethod
    def warning(msg):
        m = MyLogger()
        m.warnning(msg)

    @staticmethod
    def error(msg):
        m = MyLogger()
        m.error(msg)


class ALoggerDoing:
    '''
    进一步封装，增加异步操作和写入对象功能
    '''

    def write_msg(self, msg, mtype):
        '''
        执行写入的方法
        :param msg:
        :param mtype:
        :return:
        '''
        msg_str = str(msg)
        if mtype == "info":
            KLogger.info(msg_str)
        elif mtype == "debug":
            KLogger.debug(msg_str)
        elif mtype == "warning":
            KLogger.warning(msg_str)
        elif mtype == "error":
            KLogger.error(msg_str)

    def info(self, msg):
        pool.submit(self.write_msg, msg, "info")

    def debug(self, msg):
        pool.submit(self.write_msg, msg, "debug")

    def warning(self, msg):
        pool.submit(self.write_msg, msg, "warning")

    def error(self, msg):
        pool.submit(self.write_msg, msg, "error")

    def get_args_str(self, args):
        all_args_str = ""
        for one_arg in args:
            all_args_str = all_args_str + "    " + str(one_arg)
        return all_args_str


class Alogger:
    '''
    具体的调用类
    '''

    @staticmethod
    def info(msg, *args):
        a = ALoggerDoing()
        all_args_str = a.get_args_str(args)
        msg = str(msg) + all_args_str
        a.info(msg)

    @staticmethod
    def debug(msg, *args):
        a = ALoggerDoing()
        all_args_str = a.get_args_str(args)
        msg = str(msg) + all_args_str
        a.debug(msg)

    @staticmethod
    def warning(msg, *args):
        a = ALoggerDoing()
        all_args_str = a.get_args_str(args)
        msg = str(msg) + all_args_str
        a.warning(msg)

    @staticmethod
    def error(msg, *args):
        a = ALoggerDoing()
        all_args_str = a.get_args_str(args)
        msg = str(msg) + all_args_str
        a.error(msg)


class BloggerDoing:

    def __init__(self, info="wx1_info", warning="wx1_warning", debug="wx1_debug", error="wx1_error"):
        self.info_name = info
        self.warning_name = warning
        self.debug_name = debug
        self.error_name = error

    def write_msg(self, msg, mtype):
        '''
        执行写入的方法
        :param msg:
        :param mtype:
        :return:
        '''
        msg_str = str(msg)
        # 设置写入文件名
        m = MyLogger(info=self.info_name, warning=self.warning_name, debug=self.debug_name, error=self.error_name)
        if mtype == "info":
            m.info(msg_str)
        elif mtype == "debug":
            m.debug(msg_str)
        elif mtype == "warning":
            m.warnning(msg_str)
        elif mtype == "error":
            m.error(msg_str)

    def info(self, msg):
        pool.submit(self.write_msg, msg, "info")

    def debug(self, msg):
        pool.submit(self.write_msg, msg, "debug")

    def warning(self, msg):
        pool.submit(self.write_msg, msg, "warning")

    def error(self, msg):
        pool.submit(self.write_msg, msg, "error")

    def get_args_str(self, args):
        all_args_str = ""
        for one_arg in args:
            all_args_str = all_args_str + "    " + str(one_arg)
        return all_args_str


class Blogger:
    @staticmethod
    def info(msg, *args):
        b = BloggerDoing()
        all_args_str = b.get_args_str(args)
        msg = str(msg) + all_args_str
        b.info(msg)

    @staticmethod
    def debug(msg, *args):
        b = BloggerDoing()
        all_args_str = b.get_args_str(args)
        msg = str(msg) + all_args_str
        b.debug(msg)

    @staticmethod
    def warning(msg, *args):
        b = BloggerDoing()
        all_args_str = b.get_args_str(args)
        msg = str(msg) + all_args_str
        b.warning(msg)

    @staticmethod
    def error(msg, *args):
        b = BloggerDoing()
        all_args_str = b.get_args_str(args)
        msg = str(msg) + all_args_str
        b.error(msg)
